package com.example.zlpermissionservice.controller.inner;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.example.zlpermissionservice.api.RoleApi;
import com.example.zlpermissionservice.common.base.PageResponse;
import com.example.zlpermissionservice.common.base.ResponseResult;
import com.example.zlpermissionservice.common.constant.CommonConstant;
import com.example.zlpermissionservice.dto.request.RoleReqDTO;
import com.example.zlpermissionservice.dto.response.RoleResDTO;
import com.example.zlpermissionservice.entity.Resource;
import com.example.zlpermissionservice.entity.Role;
import com.example.zlpermissionservice.entity.RoleResource;
import com.example.zlpermissionservice.service.IResourceService;
import com.example.zlpermissionservice.service.IRoleResourceService;
import com.example.zlpermissionservice.service.IRoleService;
import com.example.zlpermissionservice.service.IUserRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @Author zhenliu（孙凌岳）
 * @Description 内部RPC接口 - 角色服务
 * @Date 2025/6/14 20:23
 * @Version 1.0
 */
@Slf4j
@Api(tags = "内部接口 - 角色控制器", hidden = true)
@RestController
@RequestMapping("/permission/inner/role")
public class InnerRoleController implements RoleApi {
    @javax.annotation.Resource
    private IResourceService resourceService;

    @javax.annotation.Resource
    private IRoleService roleService;

    @javax.annotation.Resource
    private IRoleResourceService roleResourceService;

    @javax.annotation.Resource
    private IUserRoleService userRoleService;

    /**
     * 删除角色
     * @param roleId
     * @return
     */
    @DeleteMapping("/{roleId}")
    @ApiOperation(value = "根据角色ID删除", notes = "根据角色ID删除角色（内部RPC）")
    public Integer deleteRoleById(@PathVariable("roleId") Long roleId){
        return roleService.deleteRoleById(roleId);
    }

    /**
     * 修改角色
     * @param roleReqDTO
     * @return
     */
    @Override
    @PutMapping("/update")
    @ApiOperation(value = "修改角色", notes = "修改角色信息（内部RPC）")
    public Boolean updateRole(@RequestBody RoleReqDTO roleReqDTO) {
        Boolean flag = roleService.updateRole(roleReqDTO);
        return flag;
    }

    /**
     * 新增角色
     * @param roleReqDTO
     * @return
     */
    @PutMapping
    @ApiOperation(value = "创建角色", notes = "新增角色信息（内部RPC）")
    public RoleResDTO createRole(@RequestBody RoleReqDTO roleReqDTO){
        return roleService.createRole(roleReqDTO);
    }

    /**
     * 分页查询角色信息
     * @param roleReqDTO
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    @PostMapping("/page/{pageNum}/{pageSize}")
    @ApiOperation(value = "分页查询角色", notes = "分页查询角色信息（内部RPC）")
    public PageResponse<RoleResDTO> findRolePage(
            @RequestBody RoleReqDTO roleReqDTO,
            @PathVariable("pageNum") int pageNum,
            @PathVariable("pageSize") int pageSize){
        PageResponse<RoleResDTO> roleResDTOPageResponse = roleService.findRolePage(roleReqDTO, pageNum, pageSize);
        return roleResDTOPageResponse;
    }

    /**
     * 初始化角色信息
     * 角色下拉框
     * @return
     */
    @Override
    @PostMapping("init-roles")
    @ApiOperation(value = "角色下拉框",notes = "角色下拉框")
    public List<RoleResDTO> initRoles() {
        List<RoleResDTO> roleResDTOList = roleService.initRoles();
        return roleResDTOList;
    }

    /**
     *  查询用户对应角色
     * @param userId 查询条件
     * @return: List<Role>
     */
    @Override
    @GetMapping("/find-role")
    @ApiOperation(value = "查询用户角色", notes = "根据用户ID查询角色列表（内部RPC）")
    public List<RoleResDTO> findRoleResDTOListByUserId(Long userId) {
        return roleService.findRoleResDTOListByUserId(userId);
    }

    /**
     *  查询用户列表对应角色列表
     * @param userIds 查询条件
     * @return: List<Role>
     */
    @Override
    @GetMapping("/find-roles")
    @ApiOperation(value = "查询多个用户角色", notes = "根据多个用户ID查询对应角色列表（内部RPC）")
    public List<RoleResDTO> findRoleResDTOListByUserId(@RequestParam("userIds") List<Long> userIds) {
        return roleService.findRoleResDTOListInUserId(userIds);
    }

    /**
     * 注册绑定默认角色
     * @param userId 用户ID
     */
    @Override
    @GetMapping("/default-role/{userId}")
    @ApiOperation(value = "绑定默认角色", notes = "注册时绑定默认角色（内部RPC）")
    public void bindDefaultRole(@PathVariable("userId") Long userId) {
        roleService.bindDefaultRole(userId);
    }

    /**
     * 查询用户角色码（返回 role_code）
     * @param userId 用户ID
     * @return 角色码字符串，比如 "admin"
     */
    @Override
    @GetMapping("/{userId}")
    @ApiOperation(value = "获取用户角色码", notes = "根据用户ID获取角色码，如 admin（内部RPC）")
    public String getUserRoleCode(@PathVariable("userId") Long userId){
        if (ObjectUtil.isNull(userId)) {
            return "";
        }

        //直接获取用户角色
        Role role = roleService.getUserRole(userId);

        return role.getLabel();
    }

    /**
     * 根据角色标识获取所有用户ID
     * @param roleCode
     * @return
     */
    @Override
    @GetMapping("/id-list/{roleCode}")
    @ApiOperation(value = "根据角色标识获取用户ID列表", notes = "根据角色标识（role_code）查询所有用户ID（内部RPC）")
    public List<Long> getUserIdsByRoleCode(@PathVariable("roleCode") String roleCode){
        if (StrUtil.isBlank(roleCode)) {
            return Collections.emptyList();
        }

        //根据角色标识获取角色ID
        Long roleId = roleService.getRoleIdByLabel(roleCode);
        if (roleId == null) {
            return Collections.emptyList();
        }

        //根据角色ID获取用户ID列表
        return userRoleService.getUserIdsByRoleId(roleId);
    }

    @Override
    public void upgradeToAdmin(Long userId) {

    }

    @Override
    public void downgradeToUser(Long userId) {

    }

    @GetMapping("/test")
    public String test() {
        return "权限服务调用成功！";
    }
}